package com.lcc.lynx.base.system.mapper;

import com.lcc.lynx.base.system.constant.MenuTypeConst;
import com.lcc.lynx.base.system.constant.StateConst;
import com.lcc.lynx.base.system.pojo.def.SYS_MENU;
import com.lcc.lynx.base.system.pojo.def.SYS_ROLE;
import com.lcc.lynx.base.system.pojo.def.SYS_ROLE_MENU;
import com.lcc.lynx.base.system.pojo.def.SYS_USER_ROLE;
import com.lcc.lynx.common.utils.AssertUtil;
import com.lcc.lynx.jdbc.IBaseMapper;
import com.lcc.lynx.base.system.pojo.dv.SysMenuDV;
import com.lcc.lynx.base.system.pojo.dv.SysUserDV;
import com.lcc.lynx.jdbc.qw.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

import static com.lcc.lynx.jdbc.qw.QueryMethods.distinct;

/** 
 * 系统菜单Mapper
 * @auth lcc
 * @date 2024-12-31
 */
@Mapper
public interface SysMenuMapper extends IBaseMapper<SysMenuDV>{


    /**
     * 根据用户ID获取菜单列表
     * @param userDV
     * @return
     * @author lcc
     * @date 2025/8/1 14:00
     */
    default List<SysMenuDV> getMenuByUser(SysUserDV userDV){
        AssertUtil.isNotNull(userDV.getUserId(), "用户ID不能为空");
        return QueryWrapper.resultType(SysMenuDV.class)
                .select(distinct(), SYS_MENU.all_columns)
                .from(SYS_MENU.class)
                .leftJoin(SYS_ROLE_MENU.class).on(SYS_MENU.menu_id.eq(SYS_ROLE_MENU.menu_id))
                .leftJoin(SYS_ROLE.class).on(SYS_ROLE_MENU.role_id.eq(SYS_ROLE.role_id))
                .leftJoin(SYS_USER_ROLE.class).on(SYS_ROLE.role_id.eq(SYS_USER_ROLE.role_id))
                .where(
                        SYS_USER_ROLE.user_id.eq(userDV.getUserId()),
                        SYS_MENU.state.eq(StateConst.NORMAL),
                        SYS_MENU.menu_type.in(MenuTypeConst.DIRECTORY, MenuTypeConst.MENU)
                ).orderBy(SYS_MENU.sort.asc())
                .list();
    }

}